/**
 * Copyright Statement:
 * This software and related documentation (ESWIN SOFTWARE) are protected under relevant copyright laws.
 * The information contained herein is confidential and proprietary to
 * Beijing ESWIN Computing Technology Co., Ltd.(ESWIN)and/or its licensors.
 * Without the prior written permission of ESWIN and/or its licensors, any reproduction, modification,
 * use or disclosure Software, and information contained herein, in whole or in part, shall be strictly prohibited.
 *
 * Copyright ©[2023] [Beijing ESWIN Computing Technology Co., Ltd.]. All rights reserved.
 *
 * @file buzzer_baremetal.h
 * @brief 蜂鸣器控制模块头文件 - Baremetal版本
 * @author user
 * @date 2024-01-25
 *
 * @details 蜂鸣器控制功能，适用于Baremetal环境，不依赖FreeRTOS
 * 
 * @platform ESWIN开发板
 *
 * @pins
 * | function name | port number | function number | board connector |
 * |:------------- |:------------|:----------------|:----------------|
 *     BUZZER      |   GPIO42    |      PWM1       |   J12引脚32
 *
 * @connections
 * 蜂鸣器模块连接：
 * VCC → J12引脚2 (5V) 或 引脚1 (3.3V)
 * GND → J12引脚6 (GND)  
 * I/O → J12引脚32 (GPIO42/PWM1)
 */

#ifndef __BUZZER_BAREMETAL_H__
#define __BUZZER_BAREMETAL_H__

#include <stdint.h>
#include <stdbool.h>
#include "pins_driver.h"

/* 蜂鸣器引脚定义 */
#define BUZZER_PORT         PORTC
#define BUZZER_PIN          42U

/* 音符频率定义 (Hz) */
#define NOTE_C4             262     // Do
#define NOTE_D4             294     // Re
#define NOTE_E4             330     // Mi
#define NOTE_F4             349     // Fa
#define NOTE_G4             392     // So
#define NOTE_A4             440     // La
#define NOTE_B4             494     // Si
#define NOTE_C5             523     // Do (高音)
#define NOTE_D5             587     // Re (高音)
#define NOTE_E5             659     // Mi (高音)
#define NOTE_F5             698     // Fa (高音)
#define NOTE_G5             784     // So (高音)
#define NOTE_A5             880     // La (高音)
#define NOTE_B5             988     // Si (高音)

#define NOTE_REST           0       // 休止符

/* 节拍定义 (ms) */
#define BEAT_WHOLE          1600    // 全音符
#define BEAT_HALF           800     // 二分音符
#define BEAT_QUARTER        400     // 四分音符
#define BEAT_EIGHTH         200     // 八分音符
#define BEAT_SIXTEENTH      100     // 十六分音符

/* 音符结构体 */
typedef struct {
    uint16_t frequency;     // 频率 (Hz)
    uint16_t duration;      // 持续时间 (ms)
} buzzer_note_t;

/* 函数声明 */

/**
 * @brief 初始化蜂鸣器
 */
void Buzzer_Init(void);

/**
 * @brief 蜂鸣器发声
 * @param frequency 频率 (Hz)，0表示静音
 * @param duration 持续时间 (ms)
 */
void Buzzer_Tone(uint16_t frequency, uint16_t duration);

/**
 * @brief 蜂鸣器停止发声
 */
void Buzzer_Stop(void);

/**
 * @brief 播放单个哔声
 * @param frequency 频率 (Hz)
 * @param duration 持续时间 (ms)
 */
void Buzzer_Beep(uint16_t frequency, uint16_t duration);

/**
 * @brief 播放多个哔声
 * @param frequency 频率 (Hz)
 * @param duration 每个哔声持续时间 (ms)
 * @param count 哔声次数
 * @param interval 哔声间隔 (ms)
 */
void Buzzer_BeepMultiple(uint16_t frequency, uint16_t duration, uint8_t count, uint16_t interval);

/**
 * @brief 播放旋律
 * @param melody 旋律数组指针
 * @param note_count 音符数量
 */
void Buzzer_PlayMelody(const buzzer_note_t *melody, uint16_t note_count);

/**
 * @brief 播放成功提示音
 */
void Buzzer_PlaySuccess(void);

/**
 * @brief 播放错误提示音
 */
void Buzzer_PlayError(void);

/**
 * @brief 播放警告提示音
 */
void Buzzer_PlayWarning(void);

/**
 * @brief 播放按键音
 */
void Buzzer_PlayClick(void);

/**
 * @brief 播放启动音
 */
void Buzzer_PlayStartup(void);

/**
 * @brief 播放两只老虎
 */
void Buzzer_PlayTwoTigers(void);

/**
 * @brief 播放小星星
 */
void Buzzer_PlayTwinkleStar(void);

/**
 * @brief 播放卡农
 */
void Buzzer_PlayCanon(void);

/**
 * @brief 延时函数 (毫秒)
 * @param ms 延时时间 (毫秒)
 */
void Buzzer_DelayMs(uint32_t ms);

/**
 * @brief 蜂鸣器简单测试函数
 * @details 测试LED和蜂鸣器基本功能，包括引脚控制和不同频率
 */
void Buzzer_SimpleTest(void);

/**
 * @brief LED状态指示函数
 * @param pattern 指示模式 (1=快闪, 2=慢闪, 3=流水灯, 4=全亮, 5=全灭)
 * @param count 重复次数
 */
void Buzzer_LEDStatus(uint8_t pattern, uint8_t count);

/* 预定义旋律 */
extern const buzzer_note_t melody_two_tigers[];
extern const buzzer_note_t melody_twinkle_star[];
extern const buzzer_note_t melody_canon[];
extern const buzzer_note_t melody_startup[];
extern const buzzer_note_t melody_success[];
extern const buzzer_note_t melody_error[];
extern const buzzer_note_t melody_warning[];

#endif /* __BUZZER_BAREMETAL_H__ */
